/**
 * dep收集依赖
 * dep和data里面的属性是一一对应的
 * 在视图上有几个属性，就有几个watcher
 * dep和watcher是一对多的关系  dep.name = [watcher1, watcher2]
 */
let id = 0;

class Dep {
  constructor() {
    this.id = id++;
    this.subs = [];
  }
  // 收集watcher
  depend() {
    if (Dep.target) {
      // this.subs.push(Dep.target);
      
      // 希望做到双向记忆
      // Dep收集了watcher，这一步是调用addDep使得watcher收集dep，做到有一定对应关系
      Dep.target.addDep(this);
    }
  }
  // 更新watcher
  notify() {
    this.subs.forEach(watcher => {
      // 调用watcher实例对象的原型方法update
      if (watcher) {
        watcher.update();
      }
    })
  }
  addSub(watcher) {
    this.subs.push(watcher);
  }
}

Dep.target = null; // 类的静态属性(相当于是个变量)

// 添加watcher
export function pushTarget(watcher) {
  Dep.target = watcher;
}

// 取消watcher
export function popTarget(id) {
  Dep.target = null;
}

export default Dep;